{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import cv2 # needed to create movie visualization of optimizaiton\n",
    "%matplotlib inline\n",
    "import matplotlib.pylab as plt\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "import imageio\n",
    "import torch\n",
    "import torch.distributions as dist\n",
    "\n",
    "from pybpl.library import Library\n",
    "from pybpl.model import CharacterModel\n",
    "from pybpl.concept import CharacterType\n",
    "from pybpl.part import StrokeType\n",
    "from pybpl.relation import RelationIndependent, RelationAttachAlong\n",
    "from pybpl import rendering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# library and type distribution\n",
    "lib = Library('../lib_data/')\n",
    "model = CharacterModel(lib)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for better image visualization in matplotlib\n",
    "def box_only(obj):\n",
    "    obj.tick_params(\n",
    "        which='both',\n",
    "        bottom=False,\n",
    "        left=False,\n",
    "        labelbottom=False,\n",
    "        labelleft=False\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## first, load the target image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 144x144 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "img_target = imageio.imread('./image_H.jpg')\n",
    "img_target = np.asarray(img_target, dtype=np.float32) / 255.\n",
    "plt.figure(figsize=(2,2))\n",
    "plt.imshow(img_target, cmap='Greys')\n",
    "box_only(plt)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Now, create an initial \"H\" type and token that we will optimize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def initial_H_type():\n",
    "    # first stroke has 1 sub-stroke, with id \"0\"\n",
    "    s1 = StrokeType(\n",
    "        nsub=torch.tensor(1), \n",
    "        ids=torch.tensor([0]),\n",
    "        shapes=lib.shape['mu'][0].view(5, 2, 1),\n",
    "        invscales=torch.tensor([0.5])\n",
    "    )\n",
    "    r1 = RelationIndependent(\n",
    "        category='unihist',\n",
    "        #gpos=torch.tensor([30., -22.]),\n",
    "        gpos=torch.tensor([32., -20.]),\n",
    "        xlim=lib.Spatial.xlim,\n",
    "        ylim=lib.Spatial.ylim,\n",
    "    )\n",
    "    # second stroke has 1 sub-stroke, with id \"9\"\n",
    "    s2 = StrokeType(\n",
    "        nsub=torch.tensor(1), \n",
    "        ids=torch.tensor([9]),\n",
    "        shapes=lib.shape['mu'][9].view(5, 2, 1),\n",
    "        invscales=torch.tensor([0.4])\n",
    "    )\n",
    "    r2 = RelationAttachAlong(\n",
    "        category='mid',\n",
    "        attach_ix=torch.tensor(0),\n",
    "        attach_subix=torch.tensor(0),\n",
    "        eval_spot=torch.tensor(4.5),\n",
    "        ncpt=lib.ncpt\n",
    "    )\n",
    "    # third stroke has 1 sub-stroke, with id \"0\"\n",
    "    s3 = StrokeType(\n",
    "        nsub=torch.tensor(1), \n",
    "        ids=torch.tensor([0]),\n",
    "        shapes=lib.shape['mu'][0].view(5, 2, 1),\n",
    "        invscales=torch.tensor([0.5])\n",
    "    )\n",
    "    r3 = RelationIndependent(\n",
    "        category='unihist',\n",
    "        #gpos=torch.tensor([70., -22.]),\n",
    "        gpos=torch.tensor([68., -20.]),\n",
    "        xlim=lib.Spatial.xlim,\n",
    "        ylim=lib.Spatial.ylim\n",
    "    )\n",
    "    k = torch.tensor(3)\n",
    "    P = [s1, s2, s3]\n",
    "    R = [r1, r2, r3]\n",
    "    # initialize the type\n",
    "    ctype = CharacterType(k, P, R)\n",
    "    \n",
    "    return ctype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "ctype = initial_H_type()\n",
    "ctoken = model.sample_token(ctype)\n",
    "# get optimizable parameters\n",
    "params = ctype.parameters() + ctoken.parameters()\n",
    "lbs = ctype.lbs() + ctoken.lbs()\n",
    "ubs = ctype.ubs() + ctoken.ubs()\n",
    "# set requires_grad to True for asll parameters\n",
    "ctype.train()\n",
    "ctoken.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# set large blur value to make learning easier\n",
    "ctoken.blur_sigma = torch.tensor(\n",
    "    10., dtype=torch.float, requires_grad=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 144x144 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pimg = model.get_pimg(ctoken)\n",
    "plt.figure(figsize=(2,2))\n",
    "plt.imshow(pimg.detach().numpy(), cmap='Greys')\n",
    "box_only(plt)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### optimize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 300/300 [00:16<00:00, 18.38it/s]\n"
     ]
    }
   ],
   "source": [
    "vid = 'video.mov'\n",
    "if os.path.exists(vid):\n",
    "    os.remove(vid)\n",
    "video = cv2.VideoWriter(vid,-1,10,(105,105))\n",
    "nb_iter = 300\n",
    "interval = 5 # how often we will log pimg status\n",
    "lr = 4e-3\n",
    "img_target = torch.tensor(img_target)\n",
    "\n",
    "score_type_list = []\n",
    "score_token_list = []\n",
    "score_img_list = []\n",
    "optimizer = torch.optim.Adam(params, lr=lr)\n",
    "for idx in tqdm(range(nb_iter)):\n",
    "    if idx % interval == 0:\n",
    "        # store pimg at this iteration for later viewing\n",
    "        pimg = model.get_pimg(ctoken)\n",
    "        pimg = pimg.detach().numpy()\n",
    "        pimg = np.stack([pimg, pimg, pimg], axis=2)\n",
    "        pimg = np.asarray(pimg*255., dtype=np.uint8)\n",
    "        video.write(np.copy(pimg))\n",
    "    # compute scores\n",
    "    score_type = model.score_type(ctype)\n",
    "    score_token = model.score_token(ctype, ctoken)\n",
    "    score_img = model.score_image(ctoken, img_target)\n",
    "    score = score_type + score_token + score_img\n",
    "    # append to lists\n",
    "    score_type_list.append(score_type)\n",
    "    score_token_list.append(score_token)\n",
    "    score_img_list.append(score_img)\n",
    "    # first, zero all gradients\n",
    "    optimizer.zero_grad()\n",
    "    # now, perform backward pass\n",
    "    score_neg = -score\n",
    "    score_neg.backward()\n",
    "    # optimization step\n",
    "    optimizer.step()\n",
    "    # clip params at boundaries\n",
    "    with torch.no_grad():\n",
    "        for ip, param in enumerate(params):\n",
    "            lb = lbs[ip]\n",
    "            ub = ubs[ip]\n",
    "            if lb is not None:\n",
    "                torch.max(param, lb, out=param)\n",
    "            if ub is not None:\n",
    "                torch.min(param, ub, out=param)\n",
    "                \n",
    "cv2.destroyAllWindows()\n",
    "video.release()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### check loss vs iteration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA08AAAFACAYAAABk90fmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XuczdX+x/HXZ8Zc3Y27wbhECpFJVC4JKVKkTqXSqRO/SqdOpZt0VUfX0+l0VUq6qVDoRioJEUJuKUpMbmPcDXNdvz++e8bEMGPMzHfPzPv5eHwfe+/13fu7P3vSrPnstdZnmXMOEREREREROboQvwMQEREREREpCZQ8iYiIiIiI5IOSJxERERERkXxQ8iQiIiIiIpIPSp5ERERERETyQcmTiIiIiIhIPih5EhERERERyQclTyIiIiIiIvmg5ElERERERCQfyvkdQFGrXr26i4uL8zsMEZEybdGiRducczX8jiMYqZ8SEfFffvupoEuezKwN8DIQCaQDNzrnfjAzA/4LnA8kA9c4537M63pxcXEsXLiwKEMWEZE8mNkffscQrNRPiYj4L7/9VDBO23sCeMg51wa4P/AY4DzghMAxGHjJn/BERERERKQsCsbkyQGVAvcrAxsD9y8ExjnPPKCKmdXxI0ARERERESl7gm7aHnArMM3MnsJL7s4ItNcDNuR4XkKgbdOhFzCzwXijUzRo0KBIgxURERERkbLBl+TJzGYAtXM5NRw4B/iXc26imV0KjAG6A5bL811u13fOjQZGA8THx+f6HBERkWCVlpZGQkICBw4c8DsUCUKRkZHExsYSFhbmdygiZY4vyZNzrvuRzpnZOOCWwMMPgdcC9xOA+jmeGsvBKX0iIiKlRkJCAhUrViQuLg6vXpKIxzlHUlISCQkJNGrUyO9wRMqcYFzztBHoErjfDfg1cH8KcLV5OgC7nHOHTdkTEREp6Q4cOEBMTIwSJzmMmRETE6NRSRGfBOOap+uB/5pZOeAAgbVLwGd4ZcrX4JUq/7s/4YmIiBQ9JU5yJPq3IeKfoEuenHOzgXa5tDvgpuKPSEREREREJDin7YmIiIjPKlSoUCjXueaaa2jUqBFt2rTh1FNP5fvvv88+d+uttzJr1iwA/vGPf7By5cpCec/jMXPmTK655prD2nfu3MmLL76Yr9f36dOnUGLp3r07O3bsKJRriUjhUPKUT5kuk1l/zGLc0nEs3rTY73BERERKjCeffJIlS5YwatQohgwZAsD27duZN28enTt3BuC1117jpJNO8jPMo8pv8lSYrrrqqmJ/T5ESZ/t2GD0a/vijWN5OyVM+JOxOoMNrHegytguDPh7EqaNP5fx3zmfz3s1+hyYiIlKknHMMGzaMli1b0qpVK95//30AMjMzufHGGzn55JPp06cP559/PhMmTDjqtTp37syaNWsAmDBhAr169co+17VrVxYuXAh4o1533XUX7dq1o3v37vzwww907dqVxo0bM2XKFADWrVtHp06dOPXUUzn11FOZO3dunnEtWrSILl260K5dO84991w2bcp/3am7776btWvX0qZNG4YNG3bEn0tOCxYsoG3btvz222/s27ePa6+9ltNOO422bdsyefJkAMaOHUv//v3p1asXJ5xwAnfeeWf26/v27ct7772X7xhFyowDB2DCBLjoIqhdG4YMgcDvhqIWdGuegs3e1L10fqMzicmJvHbBa3Rq2ImPf/6YB2c+SPzoeL77+3c0qqpSoSIiUkRuvRWWLCnca7ZpA88+m6+nTpo0iSVLlrB06VK2bdvGaaedRufOnZkzZw7r1q1j2bJlbN26lRYtWnDttdce9VpTp06lVatWAMyZM4cBAwbk+rx9+/bRtWtXHn/8cfr168d9993Hl19+ycqVKxk0aBB9+/alZs2afPnll0RGRvLrr79y+eWXs3DhQiZNmpRrXGlpadx8881MnjyZGjVq8P777zN8+HBef/31fP0cRo0axfLly1kS+G8xceLEXH8uWebOnZv9fg0aNODee++lW7duvP766+zcuZP27dvTvbu3c8uSJUtYvHgxERERNG/enJtvvpn69etTtWpVUlJSSEpKIiYmJl9xipRaGRnw7bfw9tswcSLs3u0lTkOHwpVXQtu2xRKGkqc83PvVvazbuY5vr/mWTg07AXDnmXfSs0lPur3ZjZ5v92TOtXOoWb6mz5GKiIgUvtmzZ3P55ZcTGhpKrVq16NKlCwsWLGD27NlccsklhISEULt2bc4+++wjXmPYsGGMHDmSGjVqMGbMGAA2bdpEjRo1cn1+eHh49qhUq1atiIiIICwsjFatWrFu3TrA20h46NChLFmyhNDQUH755ZfseHOLa/Xq1SxfvpwePXoAkJGRQZ06dQr951KpUiVWrVrF4MGDmT59OnXr1gVg+vTpTJkyhaeeegrwytGvX78egHPOOYfKlSsDcNJJJ/HHH39Qv763tWXNmjXZuHGjkicpuzZsgNdf947166FiRejf30uYzj4bQkOLNRwlT0fxx84/eGHBC9wQf0N24pSlTe02fHLFJ3Qf153z3zmfmdfMpEJ44SyuFRERyZbPEaKi4hW7zX97bp588snDRpmioqKOuFdRWFhYdjnukJAQIiIisu+np6cD8J///IdatWqxdOlSMjMziYyMzDPek08++S8FK47H0T5/nTp1OHDgAIsXL85OnpxzTJw4kebNm//lufPnz8/+fAChoaHZnxG8JCsqKqpQYhYpMdLS4JNP4NVX4YsvwDno0QOeeAL69gUf/5/QmqejeHHBixjGXWfdlev5M+qfwYeXfMjizYsZ9PEgMl1mMUcoIiJStDp37sz7779PRkYGiYmJzJo1i/bt23PWWWcxceJEMjMz2bJlCzNnzjym67Zo0SJ7/VNB7Nq1izp16hASEsJbb71FRkYGwBHjat68OYmJidnJU1paGitWrMj3+1WsWJE9e/ZkPz7SzwWgSpUqfPrpp9x7773Z73/uuefyv//9LzvpWrw47+JTzjk2b95MXFxcvuMUKZEyM+HHH+HJJ6FXL6hZ0xtdWroUhg+H336D6dPhb3/zNXECJU9HlJyWzKs/vkq/Fv1oULnBEZ/Xu1lvnuzxJJNWTeKRbx8pxghFRESKXr9+/WjdujWnnHIK3bp144knnqB27dpcfPHFxMbG0rJlS4YMGcLpp5+ePfUsP3r37n3MCVdON954I2+++SYdOnTgl19+oXz58gBHjCs8PJwJEyZw1113ccopp9CmTZvsIhP5ERMTw5lnnknLli0ZNmzYEX8uWWrVqsXUqVO56aabmD9/PiNGjCAtLY3WrVvTsmVLRowYked7Llq0iA4dOlCunCYKSSmUmQkzZ8LgwVCrFrRrB3fe6U3TGzAApk71Kug98gg0Cp76AnYsw+4lUXx8vMuq3nMsduzfwWPfPUb/Fv3pWL/jUZ/rnOOaydcwbuk4Jl46kf4t+hc0XBGRUsnMFjnn4v2OIxjl1k+tWrWKFi1a+BRR/u3du5cKFSqQlJRE+/btmTNnzl8SiLycddZZfPLJJ1SpUiVo4po5cyZjx45l7NixhRpTQdxyyy307duXc84557BzJeXfiMhfOAeLF8O778L48fDnn1C+vDcV7/zzoVs3CEx1LW757af0VcYRVI2qypM9n8zXc82MV/q8wuptq7n6o6tpULkB8XX1N4KIiJRuffr0YefOnaSmpjJixIhjSpwAnn76adavX1/oydPxxhUsWrZsmWviJFLi/PorvPeelzStXg1hYd70vKeeggsu8BKoEkLJUyGJLBfJpL9NouOYjpz95tlMuGQC5zY91++wREREiszxTLsDOP300wsnkEMcT1xxcXFcdNFFhRfMcbj++uv9DkGk4DZuhPff95KmBQvADLp0gdtvh4svhmrV/I6wQLTmqRDVrViX76/7niZVm9D73d688MMLx1SNSERERPwVTMmTSImTnOyVFD/nHIiNhdtu8/Zneuopr8z4N9/A9deX2MQJlDwVuroV6zLr77Po2aQnQz8fSs+3e7Jia/6r+YiIiMCxlQKXskX/NiTobN/uFXZo2BCuu85LlEaMgFWrYNEib7QpNtbvKAuFkqciUCmiEp9c8QnPn/c8CzcupPXLrbnx0xtJ3Jfod2giIpKDmV1iZivMLNPM4nO09zCzRWa2LHDbLdAebWafmtnPgdeNyvGaCDN738zWmNl8M4sraFyRkZEkJSXpj2Q5jHOOpKSk7H2tRHz166/e6FKDBnD//XD66fDtt/DLL/DQQ3DiiX5HWOi05qmIhFgIN7W/ictaXsZD3z7Eiwte5N1l73J/l/sZ2n4o4aHhfocoIiKwHOgPvHJI+zbgAufcRjNrCUwD6gXOPeWc+8bMwoGvzOw859znwHXADudcUzO7DHgc+FtBgoqNjSUhIYHERH3pJoeLjIwktpR8iy8l0MaN8MYbXrW85cshNBQuv9wrM96qld/RFTklT0UsJjqG5857jhvib+D26bdz+/TbeWXRK4y/eDxt67T1OzwRkTLNObcKvKqph7Tn3MF0BRBpZhHOuWTgm8BzUs3sRyDrr9gLgQcD9ycAz5uZuQIMH4WFhdEoiPY1EZEyLi0NvvwSXn3V238pIwM6dYJnn/WKP5ShZF7T9opJixot+GzgZ3w+8HP2pe6j45iOvPbja5qSISIS/C4GFjvnUnI2mlkV4ALgq0BTPWADgHMuHdgFxOR2QTMbbGYLzWyhRpdEJCg5B3PnwtChUK8e9O4Nc+Z465d++QVmzYJbbilTiRNo5KnY9Wrai8VDFjNw0kCun3o9s9fP5qXeLxEVFuV3aCIipZKZzQBy2+hnuHNuch6vPRlv+l3PQ9rLAe8BzznnfstqzuUSuX5D5pwbDYwGb5Pco34AEZHitGEDjBsHY8fCmjUQGeltYnvFFXDeeRBetpeeKHnyQY3yNfh84OeMnDWSh759iHU71zH18qlUjKjod2giIqWOc657QV5nZrHAR8DVzrm1h5weDfzqnHs2R1sCUB9ICCRXlYHtBXlvEZFideAAfPSRlzB9+aU36tS1K9x3H/TvDxX1N2oWTdvzSWhIKA90fYB3+r/D7PWz6Tu+LwfSD/gdloiIkD0l71PgHufcnEPOjcRLjG495GVTgEGB+wOArwuy3klEpNikpMALL0CTJt7I0urVXonxtWu9PZkGDVLidAglTz67vNXljOs3jm/XfcvgqYO1BkpEpBiZWT8zSwA6Ap+a2bTAqaFAU2CEmS0JHDUDo1HDgZOAHwPt/wi8ZgwQY2ZrgNuAu4v304iI5NPevfDii3DCCd6apsaNYdo0+O03r8R448Z+Rxi0NG0vCFzR6gp+TfqVB799kE4NOnF9u+v9DklESplMl8nKxJV8/fvXfLPuG0ItlJioGKpFVSMmOoZKEZWIDosmqlwU4aHhpGemk5aZRnpmOumZ6XRv3J26Fev6/TEKnXPuI7ypeYe2jwRGHuFlua1twjl3ALik8KITESlkv/ziJU1vvAG7d0OHDjBmDHTvDpbrrzY5hJKnIHFf5/uYmzCXmz+/mXZ123FqnVP9DklEfLQvdR8bdm8gNSOV+pXqUzWq6lGf75xjx4EdbN23lcR9iWzdt5UNuzfw87afWZ20mmVblpG0PwmAxlUbExEaQdL+JLbv3056Znqe8Xwx8ItSmTyJiJR6mZnw2Wfw/PPe6FJYGFxyCdx0E3TsqKTpGCl5ChKhIaG80/8d2r7SlkEfD+LHwT8SFhrmd1giUsicc2zZt4Wlm5eybOsyViSuYGXiSn5J+oWUdK8StsMdtgayfqX6tKndhqbVmpKYnMhPW35i897NhIeGEx0WTcLuBJLTkg97v6qRVWlevTl9m/elU4NOdI3rSqOqB/cPcs6xJ3UPe1L2kJyWzP70/aRmpBIWEka5kHKEhXq3tSvkVqxORESClnNe0nTffbBkCdStCw8/DNdfD7X1O72glDwFkerR1Xmp90tc8N4FPDX3Ke7pdI/fIYlIPqVnprN622qWbF7CT1t+YueBnYSHhlMxoiIVwiuwff92lm5ZytLNS0lMPrivT+0KtTmpxklc0fIKyoeXz26vGlmV+pXrExEawe87f2fplqUs2byEGb/NoHp0dVrVasXp9U4nPTOdfWn7OK/pecRViaNm+ZrZR92KdYmJijlsA9iczIxKEZWoFFGpSH8+IiJSTJzzRpgefBDmz/fWL40bB5dd5o06yXFR8hRk+jTrw8UtLubhWQ9z6cmX0qRaE79DEikTdqfsZl7CPOasn8OCjQtI2p9EiIUQERpBRLkIwkPDyXSZJKclExEakZ0QJe1PIik5icTkRFIzUgEIDw2namRVUjNS2ZO6h/TMdCLLRdKyZksuaHYBrWu15pTap9CqZitionPdQ1VEROTYHJo0NWgAr7wCf/+7kqZCpOQpCD133nNMXzudmz+/mc8GfuZ3OCLFyjnHj5t+ZPra6SzZsoRfk35lf/p+MjIzaFilISfGnEiXuC70bNIzz9GSP3b+wYrEFaRnphNiIZQPK0/lyMpUjqjM9v3bWZm4kkWbFjF7/WyWbllKpsskxEJoWbMldSrUIdNlkpKRwu6U3aSkpxAaEkpUuSiSUpNYv2s9MdExxFWJo12ddtSIrkGrWq1oU7sNJ1Y/kXIhB3+9pqSnUC6kHKEhoUX94xMRkbLmSEnTNdeU+Q1ti0LQJU9mdgrwMlABWAcMdM7tDpy7B7gOyAD+6ZybdqTrlGR1K9blwa4Pcvv025nx2wy6Ny7Q/o4iJcqqxFW8v+J93lv+Hr8k/QJAoyqNaFGjBRXCK2AYv+34jbFLx/L8gucpF1KOLg270Ld5Xy5odkH2Op7V21bz4coP+WDFByzbuizP940Oi6ZDbAfu63QfZzU4iw6xHQp9w+qIchGFej0REZHDkqaGDWH0aG9vJiVNRcaCbV8hM1sA3OGc+9bMrgUaOedGmNlJwHtAe6AuMANo5pzLONr14uPj3cKFC4s87sKWkp7CiS+cSNXIqiwcvJAQ05ZcUvIcSD+QXfkt60hMTjzs/ua9m0nYnYBhdInrwsBWA+l3Yr9cp7SlZ6bz/Ybv+eSXT5j6y1RWbVsFeGuHUjNS2b5/OwBn1j+TAScN4LS6pxEVFkVGZgZ7U/eyK2UXuw7solJEJU6qcRJNqjX5yyiRFA0zW+Sci/c7jmBUUvspEfHJvn3wwQfw0kuwYIGXNA0frqTpOOW3nwrGvxiaA7MC978EpgEjgAuB8c65FOD3wCaE7YHvfYmyiEWUi+DRbo8ycNJA3lv2HgNbD/Q7JClDnHNkukwyXAb70/azK2UXW/Zu4fedv7Nu5zp+3/E763Z5twm7E4gOiyYmOoaYqBhSM1JJ2p9E4r5E9qTuyfX6EaER2UUNapSvQYvqLTit7mkMOGkAdSrWOWps5ULK0alhJzo17MTjPR5nzfY1TF09lRWJKygXUo5WNVtx4YkXElsptih+NCIiIv5YvNgbWXr3XW+PpubNNT3PB8GYPC0H+gKT8TYbrB9orwfMy/G8hEDbYcxsMDAYoEGDBkUWaFG7rOVlPP390wz/ejgDThqgqT+Sp4zMDDJd5hHL3G9L3sba7WsPK3SwYfcGNuzawIbdG0jYnXBYmexDVYuqRlyVOFrWbEmvpr3Yn7Y/e8+gCuEVOCHmBKpHVadWhVoHk6ToGtn3K4RXOGoFuGPRtFpT/tXxX4VyLRERkaCydy+MH+8lTQsWQGSkt0fT9dfDWWdpjyYf+JI8mdkMILcC88OBa4HnzOx+YAqQmvWyXJ6f65xD59xoYDR40yGOO2CfhFgI/z7n35z79rm8+uOrDG0/1O+QxCc79u/gx00/MnfDXOZsmEPC7gRSMlI4kH6A/Wn72Z++nwPpB8h0mQDULF+TJlWb0LhqYyqGV2Tzvs0s2byEdTvXHXbtUAulbsW61K9cn/i68VzU/CLKh5cn1EKzCyRUiqhE9ejqNKraiIaVG1I5snIx/wRERETKkMREePxxL2naswdatoTnnoMrr4SqR980XYqWL8mTcy6vCgg9AcysGdA70JbAwVEogFhgY+FHF1x6NO5Bl4ZdGDlrJH9v8/e/7AMjpUNSchLz/5zP6m2rs0dvsm6379/O1n1bSdidAIBhnFzzZJrFNCOyXCSR5SKJKhdFVFgUkeUiiQj1RifX71rP2h1rmb1+NslpyVSPrk583XhuiL+Bk2qcRPXo6sRExVAtqhpVIquoCpyIiEgw2LULnn4a/vMfSE6Gyy+Hm26CDh00yhQkgm7anpnVdM5tNbMQ4D68ynvgjUK9a2bP4BWMOAH4wacwi42Z8Wi3RznrjbN4/ofnueusu/wOSQoo02Wyee9m1u1cx4+bfmRewjzm/zmfNdvXZD8nxEKoFlWNalHViImKoU6FOrSs2ZIW1VvQrk47Tqt3GlUiq/j4KURERKTQJSfD88/DqFGwYwdceik89BCceKLfkckhgi55Ai43s5sC9ycBbwA451aY2QfASiAduCmvSnulxZkNzuS8pufx+JzH+b/4/9OUqePgnGNb8jZ2p+ymZvma+SpJ7Zxj/a71LNu6jGVblvFz0s/sTd1LSnoKqRmp2VPlstbwpGWksSd1D/vT9pPpMsl0maRnpvPnnj+zN1EFqFOhDh1iO/CPtv+gQ2wHWtVqRZXIKqqsKCIiUlbs3g1vvgmPPQabN8P558PIkdC2rd+RyREEXfLknPsv8N8jnHsUeLR4IwoOI7uNpN3odjzz/TM8dPZDfofjK+ccf+75k017NrF9/3aqRlWlVvla1KlYh/DQv1abSctIY2XiSub/OZ9Zf8xi1h+z2LB7Q/b5yhGVaV2rNafVPY3T6p1GhfAKbN+/nQ27NvBz0s+s3raan7f9/JeqcbGVYqkSWYXw0HDCQ8MJNW/KmwsswQu1UGpXqE10WDShFoqZZa8riqsSR8PKDWldqzWxlWILrWiCiIiIlBDOwfffw2uvwfvve6NOnTvDhAlw5pl+Ryd5CLrkSXJ3ap1TGXDSAJ6Z9wxD2w+lRvkafodUrNIy0vhu/Xd8/PPHTF49mfW71h/2HMOoXaE29SvXxznHzgM7+WPXH9mjPbXK16Jzw878K/ZfVIuqxpZ9W1i3cx2LNy/mxYUvcmDeXyvMxVaKpXlMc64+5Wpa1WxFq1qtaFmzJZUiKhXLZxYREZFSJC3NS5aeecYrO16hAgwcCNddB+3ba01TCaHkqQR5uOvDTFo1icfnPM5TPZ/yO5xCk+ky2Za8jS17t3Ag/QApGd50uAPpB7JHjWb8NoOdB3YSWS6SHo17MOyMYTSs3JBqUdXYcWBH9iarWeW2QyyEJtWacNGJF9G2dlva1W3HCdVOOOJIT9YIVWpGKlWjqlK7Qm0qhFco5p+EiIiIlEpz5sCQIbBiBbRo4e3PdMUVXgIlJYqSpxKkRY0WXNn6Sl5Y8AK3dbyNuhXr+h3SMVu7fS3frPuGeQnzWJG4gj93/8mmvZtIz0w/4mviqsRxYfMLuejEi+jRuEeRVBwMCw3jlNqnFPp1RUREpAxLSoK77/am6NWvDxMnwkUXQYjWN5dUSp5KmAe7PMh7y95j5KyRvNj7Rb/DyZet+7by+uLXGb98PEu3LAW8TVbb1G7D2Y3Opl7FetStWJda5WsRHRZNRLmI7PVETao2KXNTFEVERKSEcw7GjYM77vCq5w0bBvffr5GmUkDJUwnTqGoj/nHqP3j1x1e544w7aFy1sd8hHdH6Xet5YOYDvLvsXVIzUukY25Fnej5D72a9jzqFTkRERKTEWrkSbrwRvv0WOnaEl1+G1q39jkoKicYMS6D7Ot9HeGg4d0y/w+9QcpWclszwr4bT/PnmjF8+nn+0/Qcrb1zJ3Ovm8q+O/6JZTDMlTiIiIlK67N0Ld90Fp5wCP/3krWuaPVuJUymjkacSqG7FugzvNJzhXw/ny7Vf0qNJD79Dyvb9hu8Z9PEgft3+KwNbDeSxcx6jQeUGfoclIiIiUjRSUuCNN+DRRyEhAa691tvstoaWHZRGGnkqoW7veDtNqjbhn1/88y8br/plT8oebv3iVs564yxSM1L56uqveLv/20qcREREpHTasMHb0LZpU7jhBoiN9UaaxoxR4lSKKXkqoSLKRfBsr2f5edvPPPP9M77FkZyWzJgfx9DihRY8N/85hrQbwk83/ES3Rt18i0lERESkSKSkwIcfQq9e0LAhjBgBzZrBtGkwd642uS0DNG2vBOvTrA8Xt7iYB2Y+wPknnE/rWkU3p3ZPyh7WbF/Dbzt+Y+2Otazdvpa1O9YyL2Ee+9L2cWqdU5l46UROjz29yGIQERER8cX27fDUUzB6tFd+PDYW7rsPrrkGGgdv8S4pfEqeSriX+7zM7Bdnc+WkK1lw/QIiykUUynUzXSZz1s/hgxUfMGv9LJZtWYbDZZ+vHl2dJlWbcFXrq7is5WV0bthZRSBERESkdNm9G559Fp5+GvbsgX79YPBg6N4dQkP9jk58oOSphKseXZ0xfcfQ570+3PPVPTxz7vFN4duftp9XFr3Cc/Of4/edvxMdFs0Z9c/ggS4P0LJmS5pUa0Ljqo2pFFGpkD6BiIiISJBJToYXXoDHH/dGmvr1g4ceglat/I5MfKbkqRTo3aw3Q08byn/m/YdTap3CoDaDjvkaWUnT43MeZ/PezXRu2JmHz36Yfif2o3x4+SKIWkTEf2Z2CfAg0AJo75xbGGjvAYwCwoFUYJhz7utDXjsFaOycaxl4XA14H4gD1gGXOud2FMsHEZHCkZICr77qVc7bvNlb2/TIIxAf73dkEiSUPJUSz5z7DKu2reK6KdcRFRbFpSdfmq/X7Uvdx8sLX+bJuU+yZd8Wzo47m/EXj6dLXJcijlhEJCgsB/oDrxzSvg24wDm30cxaAtOAelknzaw/sPeQ19wNfOWcG2Vmdwce31VkkYtI4UlLg3Hj4OGHYf166NwZPvgAOnXyOzIJMkqeSomw0DA+vuxjer3di8smXMaa7Wu488w7KReS+3/iVYmreH/F+7yw4AW2JW+je+PufND5Azo37FzMkYuI+Mc5two4bM2mc25xjocrgEgzi3DOpZhZBeA2YDDwQY5AtK1jAAAgAElEQVTnXQh0Ddx/E5iJkieR4JaRAePHw4MPwpo10L69V2r8nHNAa7klF0qeSpEK4RWYftV0rp18LcO/Hs5bP73FVa2vonlMc/am7mXrvq0s3bKUH/78gV+3/wrAeU3PY0TnEXSs39Hn6EVEgtbFwGLnXErg8SPA00DyIc+r5ZzbBOCc22RmNY90QTMbjJd80aCB9sMTKXbOwZQpMHw4rFgBrVt7j/v0UdIkR6XkqZSJDovmvYvf49KTL+WJOU8w/Ovhfzlfr2I9Tq1zKrecfgv9WvSjbsW6PkUqIlI8zGwGUDuXU8Odc5PzeO3JwONAz8DjNkBT59y/zCyuoDE550YDowHi4+NdHk8XkcI0bx4MG+ZtaNusGbz/PgwYACHa/lTypuSpFDIz+rfoT/8W/UlKTmL9rvVUiqhETHQMVSKr+B2eiEixcs51L8jrzCwW+Ai42jm3NtDcEWhnZuvw+tCaZjbTOdcV2GJmdQKjTnWArccfvYgUmi1b4JZbvGSpVi14+WW47joopz+HJf/0r6WUi4mOISY6xu8wRERKFDOrAnwK3OOcm5PV7px7CXgp8Jw44JNA4gQwBRiEV6VvEHDUUS0RKSbOwdixcPvtsG8fPPAA3HEHVKjgd2RSAml8UkREyiwz62dmCXgjSp+a2bTAqaFAU2CEmS0JHEdcwxQwCuhhZr8CWaXORcRPP/0EPXrAtdfCySfD0qVecQglTlJAGnkSEZEyyzn3Ed7UvEPbRwIj83jtOqBljsdJwDmFHKKIFMT69XD//V758SpV4MUXYcgQrWuS46bkSURERERKhx07YNQo+O9/vcd33AH33ANVq/obl5QaSp5EREREpGRLT4eXXvLWM+3cCVddBY88AtoKQAqZxi5FREREpOSaORPatoV//hPatYPFi+HNN5U4SZFQ8iQiIiIiJc+GDXDZZXD22bB3L0yaBNOnwymn+B2ZlGJKnkRERESk5DhwAB59FE48ESZP9qrnrVwJ/fqBmd/RSSmnNU8iIiIiUjJ88gnceiusXQv9+8PTT0NcnN9RSRniy8iTmV1iZivMLNPM4g85d4+ZrTGz1WZ2bo72XoG2NWZ2d/FHLSIiIiK++PVX6N0bLrgAwsPhyy9h4kQlTlLs/Jq2txzoD8zK2WhmJwGXAScDvYAXzSzUzEKBF4DzgJOAywPPFREREZHSau9er9R4y5bw3XfeSNPSpdC9u9+RSRnly7Q959wqADt8XuqFwHjnXArwu5mtAdoHzq1xzv0WeN34wHNXFk/EIiIiIlJsnIPx42HYMPjzTxg0yNu/qXZtvyOTMi7YCkbUAzbkeJwQaDtSe67MbLCZLTSzhYmJiUUSqIiIiIgUgaVLoWtXuOIKL1maOxfGjlXiJEGhyJInM5thZstzOS482styaXNHac+Vc260cy7eORdfo0aNYw1dRERERIrb9u0wdCiceiqsWAGjR8P8+dCxo9+RiWQrsml7zrmCTEZNAOrneBwLbAzcP1K7iIiIiJRUGRkwZgzcey/s2AE33ggPPwxVq/odmchhgm3a3hTgMjOLMLNGwAnAD8AC4AQza2Rm4XhFJab4GKeIiIiIHK/Vq+GMM2DIEDj5ZFi8GP73PyVOErT8KlXez8wSgI7Ap2Y2DcA5twL4AK8QxBfATc65DOdcOjAUmAasAj4IPFdERERESprMTHj+eWjbFtasgbffhpkzoXVrvyMTOSq/qu19BHx0hHOPAo/m0v4Z8FkRhyYiIiIiRSkhAa691tur6bzz4LXXoG5dv6MSyZdgm7YnIiIiIqVRZqZXBKJVK5gzB156CT79VImTlChKnkRERESkaC1bBp06eWub2rSBJUvg//4PDt/zUySoKXkSERERkaKxd6+30W3btl5xiDffhK+/hhNO8DsykQLxZc2TiIiIiJRizsHHH8Mtt8CGDfCPf8CoURAT43dkIsdFI08iIiIiUnhWrYLevaF/f6hSxVvf9OqrSpykVFDyJCIiIiLHb/duuPVWryDE3Lnw9NOwaJG3j5NIKaFpeyIiIiJScM7BBx/Av/4FmzfD9dfDyJFQo4bfkYkUOiVPIiIiIlIwv/wCN90EM2ZAu3YweTKcdprfUYkUGU3bExEREZFjs38/3H+/N0Xvhx/g+edh/nwlTlLqaeRJRERERPLv889h6FD47TcYOBCeegpq1/Y7KpFioZEnEREREcnbhg1w8cVw/vkQHu7t1/T220qcpExR8iQiImWWmV1iZivMLNPM4nO09zCzRWa2LHDbLce5cDMbbWa/mNnPZnZxoD3CzN43szVmNt/M4or/E4kUgbQ0b3SpRQtv1Omxx2DpUjj7bL8jEyl2mrYnIiJl2XKgP/DKIe3bgAuccxvNrCUwDagXODcc2Oqca2ZmIUC1QPt1wA7nXFMzuwx4HPhbkX8CkaI0ezbccAMsXw59+sBzz0GjRn5HJeIbjTyJiEiZ5Zxb5ZxbnUv7YufcxsDDFUCkmUUEHl8L/DvwvEzn3LZA+4XAm4H7E4BzzMyKLnqRIpSYCNdeC506efs3ffwxTJ2qxEnKPCVPIiIiR3cxsNg5l2JmVQJtj5jZj2b2oZnVCrTVAzYAOOfSgV1ATPGHK3IcnIPx470pem+9BXffDStXwoUX+h2ZSFBQ8iQiIqWamc0ws+W5HHn+NWhmJ+NNvxsSaCoHxAJznHOnAt8DT2U9PZdLuCNcd7CZLTSzhYmJicf8mUSKxObN0L8/XH45NGkCS5bAv/8N5cv7HZlI0NCaJxERKdWcc90L8joziwU+Aq52zq0NNCcByYF2gA/x1joBJAD1gQQzKwdUBrYfIabRwGiA+Pj4XBMskWI1ebI3TW/fPnjiCfjXv6Cc/kwUOZRGnkRERA4RmJ73KXCPc25OVrtzzgFTga6BpnOAlYH7U4BBgfsDgK8DzxcJXgcOwM03w0UXQVycV0Vv2DAlTiJHoORJRETKLDPrZ2YJQEfgUzObFjg1FGgKjDCzJYGjZuDcXcCDZvYTcBVwe6B9DBBjZmuA24C7i+2DiBTEqlVw+unw/PPeSNPcudC8ud9RiQQ1fa0gIiJllnPuIw5OwcvZPhIYeYTX/AF0zqX9AHBJYccoUuicgzfe8EacoqPh00+9jW9FJE8aeRIREREpK3btgiuugOuu80adli5V4iRyDJQ8iYiIiJQFP/wAbdvChx/Co4/Cl19C3bp+RyVSoih5EhERESnNMjO9CnpnngkZGTBrFtx7L4SG+h2ZSIlz1DVPZlbtaOedc7mWYBURESlM6o9ECmjLFrj6apg+HS6+GF59FapW9TsqkRIrr4IRi/A2+DOgAbAjcL8KsB5oVKTRiYiIeNQfiRyr6dPhqqtg9254+WUYPBgst72cRSS/jjptzznXyDnXGJgGXOCcq+6ciwH6AJOKI0ARERH1RyLHICUF7rwTzj0XqleHBQtgyBAlTiKFIL9rnk5zzn2W9cA59znQpWhCEhERPzkHe/fCn3/C2rWwYgXs2eN3VNnUH4kczU8/Qfv28OST3kjTggXQsqXfUYmUGvnd52mbmd0HvI03beJKIKmgb2pmlwAPAi2A9s65hYH2GGACcBow1jk3NMdr2gFjgSjgM+AW7dwuImWdc7B/PyQnw759B2/37fMSoKzbrCPn40PP7d4NO3bAzp2Qnv7X95k2DXr29OczHqJQ+yORUiMjw0uY7r8fqlWDqVOhTx+/oxIpdfKbPF0OPMDBjQRnBdoKajnQH3jlkPYDwAigZeDI6SVgMDAPL3nqBXx+HDGIiAStvXshIeGvx8aNkJjoHdu2ebdJSd7fTPkVGgoVKhw8ypf3bmvWhKZNvXXkVap4t5UrQ1SUd7RuXXSf9RgVdn8kUvKtXesVhZg7FwYMgJde8qbriUihy1fyFKhidIuZVQIynXN7j+dNnXOrAOyQubfOuX3AbDNrmrPdzOoAlZxz3wcejwMuQsmTiASBjAxviUFqqndk3d+//8hHcrK3V+XOnd6xa5c36rNpk5co7dp1+PtUq+YlOdWrQ7NmXtXhmBioVMlLgrKO6OiDSdGhSVJ4eMle9lDY/ZFIieYcjBkDt94K5crB2297G+CW5P/JRYJcvpInM2sFjAOqBR5vAwY555YXYWw51QMScjxOCLTlyswG441S0aBBg6KNTESKRWamN9qSNQrzxx/w+++wbp13bN3qJSQpKRAS4o2whIYevF+Q25AQb/pazoQo5/2s28zMgn+uqChvpKdKFW+kp1kz6NYNYmMPHvXqeUdkZGH9NEuuIOiPRILD1q1w/fUwZYr3S2PsWKhf3++oREq9/E7bewW4zTn3DYCZdQVGA2cc6QVmNgOoncup4c65yccYZ25foRxxvZNzbnQgPuLj47UuKiA5Gb77Dr75Blav9v7w3LvX+8MvKgpq14YGDeCUU6BNG+9WW0HI0aSnw4EDBxOJrOPQx4e2ZSUhWUda2sH7yckHR2Kyju3bvSlrqal/ff/oaIiL8462bb3RlfBw7990ZqY3IpR1m/P+sdyGhXnXDA+HiIi/3ubWlvNcZOTBaW9ZR1ZbdLSXLEVE+PFfrkQ75v5IpNSZNs2bprdrF/znP/DPf3rf9ohIkctv8lQ+q6MCcM7NNLPyR3uBc677cUX2VwlAbI7HscDGQrx+qfbTT/Dcc/DOO94fumFhcMIJ0KiR9213SIi3cHzLFvjiC+/Lqyxt20L37nDOOdCpk/cHn5QcKSle4pF17N7912ljud0/2rlD7x/LWpv8CAs7OBJTubJ31KkDJ53kjbzkHImJi/Omr2l2SplzzP2RSKnhHDz7LNxxh1dB76uvVElPpJjlN3n6zcxGAG8FHl8J/F40IR3OObfJzPaYWQdgPnA18L/iev+SassWuO02ePdd7w/Sq66C/v2hc+ejJ0FbtsDSpTB/Pnz9Nfz3v14Bn/Bw6NoVLrwQ+vb1/oiVwuecl/QkJx88spKVnMeePX9NjLZv94oH5HycnJy/9zQ7ODISHX34/SpVDj+XcyQla8Ql68jv46wRmrAw71AiJPnga38k4pvUVLjpJnjtNa8zHzfOG24XkWJl+an2bWZVgYeAs/Cm0M0CHnTO7SjQm5r1w0t+agA7gSXOuXMD59YBlYDwwLmezrmVZhbPwVLlnwM356dUeXx8vFu4cGFBwizRPvzQ294hORnuustbS1qtWsGulZwMs2d7G5VPnQq//OK1x8d7idSFF3pffJW2P3yd8z57ViKSVcJ5x46/3t+58+Bam5xT0XKbnpbVlpHhXT/ryMw8/H5+hYd7RQOqVcv7qFTp8AQoOrrkFxGQ4Gdmi5xz8YVwnULtj4JBWe2n5Bhs2+ZV0fv2Wxg+HB5+WNP0RApZfvupfCVPOS5a4qoblbVOyTn497+9360dOsAbb8CJJxbue/z8M3z8MUyeDPPmeW2NG8NFF3nHGWd4C+6DWXKyV2Tg998PHuvWeaNuOUdu0tKOfA0zb1pZlSoHq5gdOqKS2+PwcO/nY+YdISEH75t556KjDyY5WfcPPSpU8JKmqCglPhL8Cit5ynG9EtcfHUlZ66fkGK1cCRdc4O1aPWYMDBzod0QipVKhJk+HVjcCSkx1o7LUKTkHN98ML7zgVSp9/fWiX4y+ebM3GvXxxzBjhjeqUqOG93v+oou8aX4VKxZtDLlJSYH16w8mRTkTpN9/94oU5RQV5a2hqVPn8NGaqlUPP6pU8UZx9MWfSP4U4shTie2PjqQs9VNyjL74Av72N6+T+vhj71tRESkS+e2niqzanhS/Rx7xEqfbboOnniqe0Yjatb1Kqddf763B+eIL+OgjmDDBS95CQ73pfV27wmmneQv/mzb11rccj5QUbz+cIyVHGzf+depbuXLQsKGXIPXt6xXLiIvzbhs1glq1NHojUkKoP5LSLz3d69QfecTboXrKFK8croj4rsiq7UnxGjMGHnjAq1xaXInToSpWhEsu8Y7UVJg1C2bO9I6nn/b6AvASp4YND67TqVz5r/E6502Xy21fnd27vVGjQzcQDQnxCljExXnVAQ9NjurWDf6phCKSL+qPpHRLSPCm5s2a5XXqL7zgzdMWkaBQIqrtydEtWQI33gg9e3pFeIJhBCU83EtiugcK1icnw6pVsGKFd6xf760p2roV1qzJ/fU51wtlrSlq0sQbJapVyxv1ytrjp35977yIlHrqj6T0mjIF/v537xvDN9/0kicRCSr5TZ6uxatuNImD1Y3+XlRBSf4lJ8Pll3ujOO+8c/zT4YpKdDS0a+cdIiLHQf2RlD4pKXDnnd6mjG3bwvjx0KyZ31GJSC7ylTwFSsD+s4hjkQK47Tav+t2XX3obhoqIlGbqj6TU+fNPb9+mH36AW26Bxx8v+mpPIlJg+UqezKwZcAcQl/M1zrluRROW5Me338Irr8Dttx+cHiciUpqpP5JSZfZsb/+mfftg4kQviRKRoJbfaXsfAi8DrwEZRReO5FdaGgwd6hVeePhhv6MRESk26o+kdHjtNbjhBq+q0ddfe+VoRSTo5Td5SnfOvVSkkcgxeeEFWL4cJk3y1hOJiJQR6o+k5Bs1Cu65B3r1gvfe8zYPFJES4ahbfJpZNTOrBkw1sxvNrE5WW6BdfLB1q1eW/NxzvY1oRURKO/VHUio45yVN99zjVXuaMkWJk0gJk9fI0yLA4VU0AhiW45wDGhdFUHJ0//437N0Lzz4bHGXJRUSKgfojKdkyM7359i+9BEOGeFNItAGhSIlz1OTJOdeouAKR/ElI8H7vDhoEJ57odzQiIsWjqPojM7sEeBBoAbR3zi0MtPcARgHhQCowzDn3deDc5cC9eEnbRuBK59y2wAjY+3jFLNYBlwaqA0pZl5bm7d/0zjteSfJRo/Ttp0gJddTkycy6Oee+NrNcy7845yYVTVhyJI8+6n15df/9fkciIlJ8irA/Wg70B145pH0bcIFzbqOZtQSmAfXMrBzwX+CkQML0BDAULwG7G/jKOTfKzO4OPL6rgHFJaZGcDFdcAZMnw2OPeVP2RKTEymvaXhfga+CCXM45vE0KpZj8/rtXnGfwYIiL8zsaEZFiVST9kXNuFYAdMgrgnFuc4+EKINLMIoBMvKmD5c0sCagErAk870Kga+D+m8BMlDyVbZs3Q9++sHAhPP883HST3xGJyHHKa9reA4Fb7d4eBJ56CkJC4N57/Y5ERKR4+dwfXQwsds6lAJjZDcAyYB/wK5D1F3Et59ymQJybzKzmkS5oZoOBwQANGjQowtDFNz/9BBdcANu2wUcfwYUX+h2RiBSCvKbt3Xa08865Zwo3HDmSxER4/XW46iqoV8/vaEREitfx9EdmNgOoncup4c65yXm878nA40DPwOMw4AagLfAb8D/gHmDk0a6TS7yjgdEA8fHx7lheKyXAZ5/B3/4GlSt7G+G2bet3RCJSSPKatlexWKKQPD3/PKSkwLBheT9XRKQUKnB/5JzrXpDXmVks8BFwtXNubaC5TeCaawPP+QBvbRPAFjOrExh1qgNsLWjMUoL9739w661wyikwdaq+8RQpZfKatvdQcQUiR7Zvn5c8XXghNG/udzQiIsWvuPsjM6sCfArc45ybk+PUn8BJZlbDOZcI9ABWBc5NAQbhVekbBBx1VEtKmfR0L2l64QVvE8a334by5f2OSkQK2VE3yc1iZs3M7CszWx543NrM7iva0CTLG2/A9u1edVMRkbKssPsjM+tnZglAR+BTM5sWODUUaAqMMLMlgaOmc24j8BAwy8x+whuJeizwmlFADzP7FS+pGlXQuKSE2b8f+vf3Eqdhw2DiRCVOIqWUOZf3VGsz+xZvQ8JXnHNtA23LnXMtizi+4xYfH+8WLlzodxgF5hy0aOFtQD5vnt/RiIgUjJktcs7FF8J1Smx/dCQlvZ8q8/bs8aaGzJzpTRO58Ua/IxKRAshvP5XXmqcs0c65Hw4p5ZpeoMjkmHz1FaxeDePG+R2JiEhQUH8kwWP7djj/fK8U+VtvwcCBfkckIkUsv8nTNjNrgreXBmY2ANhUZFFJtuefhxo14JJL/I5ERCQoqD+S4LB5M/Ts6X3DOXGiSpGLlBH5TZ5uwiupeqKZ/Qn8DlxZZFEJAOvXe4V67roLIiP9jkZEJCioPxL//fEHdO8OmzZ5ZcnPOcfviESkmOQ3efrTOdfdzMoDIc65PWZWrSgDE3j5Ze/2//7P3zhERIKI+iPx1+rV0KOHt9bpyy+hY0e/IxKRYpSvanvAJDMr55zbF+ioagNfFmVgZV16uldlr3dv0ObzIiLZ1B+Jf5YuhU6dvI0XZ85U4iRSBuU3efoYmGBmoWYWB0zH21Fdisjnn3vTqa+7zu9IRESCivoj8cf330PXrhARAbNmeZvgikiZk69pe865V80sHK/TigOGOOfmFmVgZd2YMVCrllfER0REPOqPxBdffeUVhKhTB2bMgIYN/Y5IRHxy1JEnM7st6wAigfrAEqBDoK1AzOwSM1thZplmFp+jvYeZLTKzZYHbbjnOtQu0rzGz5+yQOrWlyebN8MknMGgQhIX5HY2IiP+Kqj8SydPkyd43mY0bw3ffKXESKePyGnmqeMjjj47QfqyWA/2BVw5p3wZc4JzbaGYtgWlAvcC5l4DBwDzgM6AX8PlxxhGUxo2DjAz4+9/9jkREJGgUVX8kcmTvvON9k9munTefvppqk4iUdUdNnpxzDxXFmzrnVgEcOnjknFuc4+EKINLMIoBqQCXn3PeB140DLqIUJk/OwdixcOaZcOKJfkcjIhIciqo/Ejmil1+GG2/01jlNngwVlaeLSB7Jk5k965y71cymEtiQMCfnXN8iiwwuBhY751LMrB6QkONcAgdHpA5jZoPxRqloUMJK1S1dCqtWHSxTLiIivvdHUpY4B6NGwb33Qp8+8OGH2mxRRLLlNW3vrcDtU8d6YTObAdTO5dRw59zkPF57MvA40DOrKZenHdZ5Zp9wbjTeJorEx8cf8XnB6N13oVw5GDDA70hERIJKgfsjkXxLT4ehQ+GVV2DgQG/PEC0+FpEc8pq2tyhw++2xXtg5170gAZlZLN5c9qudc2sDzQlAbI6nxQIbC3L9YJaZCe+9B716QUyM39GIiASP4+mPRPJl717429/gs8/gnntg5EgIye+OLiJSVuQ1bW8ZRx/haV2YwZhZFeBT4B7n3Jwc77PJzPaYWQdgPnA18L/CfO9gMHs2JCTAE0/4HYmISHAp7v5IypjNm70peosXe/PmhwzxOyIRCVJ5TdvrUxRvamb98JKfGsCnZrbEOXcuMBRoCowwsxGBp/d0zm0FbgDGAlF4hSJKXbGId9+F6Gjoq5n7IiKHKpL+SISffvI63sREmDIFevf2OyIRCWJ5Tdv749A2M+vjnPvkeN7UOfcRB8vM5mwfCYw8wmsWAi2P532DWWqqtyb1oougfHm/oxERCS5F1R9JGffxx3DllVC5Msya5ZUkFxE5ioJM5n240KMQpk+H7dvhiiv8jkREpMRQfyQF4xw89hj06wcnnwwLFihxEpF8yWvaXm5yq3wnx+ndd70iET175v1cEREB1B9JQezfD9dd51VoGjgQXn0VoqL8jkpESoiCjDxpFWUh27fP239vwABVRBUROQbqj+TY/PkndO4M48d7I09vvaXESUSOSb5Gnsys/yGPY4FdwLJAMQc5DtOmQXIyXHqp35GIiAQ39UdSYPPnewuL9+711jqpOpOIFEB+p+1dB3QEvgk87grMA5qZ2cPOubeO9ELJ26RJUK2a92WYiIgclfojOXYTJniFIerVgxkzvHVOIiIFkN/kKRNo4ZzbAmBmtYCXgNOBWRzc+V2OUWoqfPIJ9O8P5QqyAk1EpGxRfyTH5s034dproUMHb4589ep+RyQiJVh+1zzFZXVUAVuBZs657UBa4YdVdnzzDeza5RX8ERGRPKk/kvx77TW45hro1s0ra6vESUSOU37HOr4zs0+ADwOPBwCzzKw8sLNIIisjPvrI29epRw+/IxERKRHUH0n+TJgAgwfDeed58+MjI/2OSERKgfwmTzcB/YGz8ErDvglMdM454Owiiq3Uy8jw1qz27q3f6SIi+aT+SPI2Y4ZXhvyMM7wkSp2siBSSfCVPzjlnZrOBVMABPwQ6KjkO338PW7Zoyp6ISH6pP5I8/fCDV1WveXNvUXF0tN8RiUgpkq81T2Z2KfAD3vSIS4H5ZjagKAMrCz76CMLD4fzz/Y5ERKRkKOz+yMwuMbMVZpZpZvE52tub2ZLAsdTM+uU418vMVpvZGjO7O0d7IzObb2a/mtn7ZhZe0LikgFat8jrVmjW9fUCqVPE7IhEpZfI7bW84cFrWHhpmVgOYAUwoqsBKO+e8Kdg9ekClSn5HIyJSYhR2f7QcbxrgK7m0xzvn0s2sDrDUzKbijXa9APQAEoAFZjbFObcSeBz4j3NuvJm9jFdW/aUCxiXHav166NnTK1375ZdQp47fEYlIKZTfanshh2w+mHQMr5VcLF0K69b9f3v3Hh1Vdfd//P0loLCEimIEHrlF6yXlFiEGLTHIrXJTRKHeaqH8XHilWitVftrnqc9itUgeW360WrUFsUoFBdF6acFwMRIuEiQQaESijRC5hSCW+y3798c5yTPCJEzITE4m+bzWmjUz+5yz57s5cbbf2fvsoyl7IiLVFNX+yDlX4JzbFKb8oHPuuP+2KV7SBJAGFDrnvnDOHQVmA8PNzIB+/G8S9zJw05nGJdW0c6eXOO3b5404XXJJ0BGJSD0V6cjTP8xsAfCa//5W4P3YhNQwvPsumMENNwQdiYhIXKm1/sjMegEzgI7AXf4o1EXA1pDdivHuMdUK2BuScBUDF1VR9zhgHECHDh1iEH0Dsns3DBgAW7d6iVP37kFHJCL1WKQLRkwws1uA3nirG73onJsf08jquffeg6uu8qZli4hIZM6kPzKzLKBNmE1POOferuKzVgLFyLIAACAASURBVAGdzSwZeNnM/u5/5im7VlFeWd0vAi8CpKamasGLM7V7tzf/vbDQ61jT04OOSETquUhHnnDOzQPmxTCWBqOkBFatgl/9KuhIRETiT3X7I+fcgBp+XoGZHQC64I0otQ/Z3A7YBuwGWppZY3/0qbxcYmXrVm+qXlGRd9+Pfv2CjkhEGoAqkycz20f4X84Mb8VYLXVwBhYs8BaM0Cp7IiKRqe3+yMySgK3+VL2OwOVAEd6NeC/1t38F3Abc4S+hvgRvFcDZwGig0lEtqaGNG72b337zjdepZmQEHZGINBBVJk/OuRa1FUhD8t570Lo19OgRdCQiIvEhVv2RvwT574FE4D0zy3POXY93E97HzewYUAbc75zb7R/zILAASABmOOc2+tU9Bsw2s0nAWmB6LGJu8N5+G370I2jeHJYuhSuvDDoiEWlAIp62J9Fx/Lj3I9nw4dBI6xWKiATKv17qlGumnHOvAK9Ucsz7hFmkwjn3Bd5qfBILzsGkSfCf/+ldNDx/PlxU6ZocIiIxoeSplq1cCV9/DUOHBh2JiIhInDhwAMaMgblzvVGnF1+EZs2CjkpEGiAlT7Xs/fe9+/cNHBh0JCIiInGgsBBuvtm7zikzE37+c+9eHyIiAVDyVMvKV1I999ygIxEREanj3nsP7rwTEhK8Xx+vvz7oiESkgdNVN7WouBjWr9eUPRERkSqVlcFTT8GwYZCUBLm5SpxEpE7QyFMtet+/vFhLlIuIiFRi717vuqb33oO77oIXXtD1TSJSZyh5qkULF0KHDpCcHHQkIiIidVB+PowYAV9+CX/4A9x/v65vEpE6RdP2asmJE7B4MQwYoH5ARETkFK+9BldfDQcPevdveuABdZgiUucoeaola9d6S5QPGBB0JCIiInXIiRPwi1/AHXd4N7xdswZ69w46KhGRsAJJnsxslJltNLMyM0sNKU8zszz/sc6/83v5tkFmtsnMCs3s8SDirolFi7znfv2CjUNERKTO+OYbuPFGbwnye+/1pmi0bRt0VCIilQrqmqcNwM3AC2HKU51zx82sLbDOzN4BHPAsMBAoBlab2d+cc/+szaBrIisLunWD1q2DjkRERKQO+PxzbzW9wkJ47jm4776gIxIROa1AkifnXAGAnTSX2Tl3MORtU7ykCSANKHTOfeEfNxsYDsRF8nToEHz0kXfdq4iISIOXnw8/+AEcPeqtptS3b9ARiYhEpM5d82RmvcxsI5AP3OucOw5cBGwN2a3YL6usjnFmlmtmuSUlJbENOALLl8ORI7reSUREhJUroU8faNQIsrOVOIlIXIlZ8mRmWWa2IcxjeFXHOedWOec6A1cBE82sKRBuuR0Xpqy8jhedc6nOudTExMSaNSQKsrKgcWPIyAg6EhERkQCVLzt73nmwbBl07hx0RCIi1RKzaXvOuRqNszjnCszsANAFb6SpfcjmdsC2mtRfmxYtgmuugebNg45EREQkIDk5cMMNkJQEH3yghSFEJC7VqWl7ZpZkZo391x2By4EiYDVwqb/9LOA24G+BBVoNX38NubnQv3/QkYiIiATkk09gyBBo1877RVGJk4jEqaCWKh9hZsXANcB7ZrbA35SOt8JeHjAfuN85t9u/7ulBYAFQALzunNsYROzVtWQJOKfrnUREpIH64gsYPBhatvTmsWvZWRGJY0GttjcfLzk6ufwV4JVKjnkfeD/GoUVdVpY3XS8tLehIREREallpqTfidPy4t6pe+/anP0ZEpA4L6j5PDUZWFlx3HTRpEnQkIiIitejwYbjpJigq8jrDyy8POiIRkRqrU9c81TdbtsDmzZqyJyIiDUxZGYwZ462o9/LLkJ4edEQiIlGh5CmGFi3ynrVYhIiINCgTJ8KcOTBlCtx6a9DRiIhEjZKnGCq/Lla3sRARkQbjuee8pOm+++DRR4OORkQkqpQ8xYhzXvI0YABYuFv8ioiI1DfvvAPjx8OwYTBtmjpAEal3lDzFyIYNsGuXrncSEZEGIjcXbrsNrrwSZs+GxlqTSkTqHyVPMaLrnUREpMH44gtvtOnCC+Hdd+Gcc4KOSEQkJvSzUIxkZcFll+mWFiIiUs999ZU3zeLoUe/O8G3aBB2RiEjMaOQpBo4dg6VLNWVPRETquZISGDjQe/7HPyA5OeiIRERiSslTDKxaBQcOKHkSEZF67PPPvfs3/etf3lS9tLSgIxIRiTklTzGQlQWNGsF11wUdiYiIVMXMRpnZRjMrM7PUkPI0M8vzH+vMbIRf3t7MlphZgX/cQyHHnG9mH5jZZv/5vCDaVCtWroSrr4bdu2HhQujTJ+iIRERqhZKnGFi0CFJT4bz6222KiNQXG4Cbgeww5anOuRRgEPCCmTUGjgM/d84lA1cDD5jZ9/xjHgcWOecuBRb57+uf11+Hvn3h3HNhxQq49tqgIxIRqTVKnqJs3z7vBzmtsiciUvc55wqcc5vClB90zh333zYFnF++3Tn3if96H1AAXOTvNxx42X/9MnBTLGOvdf/+N4wdC7fe6i1HvmKFtzKSiEgDouQpyrKz4fhxXe8kIhLvzKyXmW0E8oF7Q5Kp8u2dgCuBVX5Ra+fcdvCSLODCKuoeZ2a5ZpZbUlISi/Cj58QJePll6NLFe37iCW9VpMTEoCMTEal1Sp6iLCsLmjaF738/6EhERATAzLLMbEOYx/CqjnPOrXLOdQauAiaaWdOQOpsD84CHnXP/rm5MzrkXnXOpzrnUxLqchCxb5o0yjRnj3cPpo49g0iQ466ygIxMRCYTu8xRlWVne9O+mTU+/r4iIxJ5zrkZzAZxzBWZ2AOgC5JpZE7zEaZZz7s2QXXeaWVvn3HYzawvsqsnnBqq0FB57DKZPhw4dYPZsGDXKWw1JRKQB07dgFO3YARs26HonEZF4Z2ZJ/gIRmFlH4HKgyMwMmA4UOOd+e9JhfwNG+69HA2/XVrxRU1YGL70El18OM2fChAnwz3961zkpcRIRUfIUTYsXe8+63klEJD6Y2QgzKwauAd4zswX+pnRgnZnlAfOB+51zu4HewF1Av5ClzIf4x0wGBprZZmCg/z5+bNzo3WNj7Fi44gpYuxamTIFzzgk6MhGROkPT9qIoKwvOPx9SUoKOREREIuGcm4+XHJ1c/grwSpjyZYBVUlcpEH9zDw4cgKeegt/9zlt+fPp07xonjTSJiJxCyVOUOOclT/36QUJC0NGIiIhE4NAhb7rEypVw990weTK0ahV0VCIidZZ+VoqSzZth61Zd7yQiInGirAx+8hNYtQreeAP+9CclTiIip6GRpygpv95JyZOIiNR5zsGTT8KcOfD00zByZNARiYjEBSVPUbJoEbRvD9/9btCRiIiIVKGsDB5+GH7/exg3zltRT0REIqJpe1FQVgZLlnjXO1nYy4hFRETqAOdg9GgvcXrkEfjjH9VxiYhUg5KnKMjP9+4nqCl7IiJSp730Erz6qre63jPPaEU9EZFq0rdmFCxa5D337RtsHCIiIpVauxZ+9jPIyPCudxIRkWpT8hQFixfDZZdBu3ZBRyIiIhLGZ595S5K3bAl/+YtGnEREzlAg355mNsrMNppZmZmlhtnewcz2m9mjIWWDzGyTmRWa2eO1G3Hljh2DDz/UlD0REamj9u+HG2/0EqbFi6Fjx6AjEhGJW0H99LQBuBnIrmT774C/l78xswTgWWAw8D3gdjP7XqyDjERurtcv9esXdCQiIiJhvPACbNoEs2fDJZcEHY2ISFwLZKly51wBgIVZ4cfMbgK+AA6EFKcBhc65L/x9ZgPDgX/GPNjTKL+/03XXBRqGiIjIqY4dg6lToU8fTZEQEYmCOjXp2czOAR4Dnjpp00XA1pD3xX5ZZfWMM7NcM8stKSmJfqAhFi+GlBS44IKYfoyIiEj1/fnPUFysezmJiERJzJInM8sysw1hHsOrOOwp4HfOuf0nVxdmX1dZJc65F51zqc651MTExDMJPyKHDkFOjqbsiYhIHbR7NzzxhNdJDRkSdDQiIvVCzKbtOecGnMFhvYCRZjYFaAmUmdlhYA3QPmS/dsC2mkdZMytWwJEjmgkhIiJ10PPPw9dfw7RpuhGuiEiUBHLNU2Wcc9eWvzazXwH7nXN/MLPGwKVmlgR8BdwG3BFMlP9r0SJISIBrrz39viIiIrXGOZg1y7unU+fOQUcjIlJvBLVU+QgzKwauAd4zswVV7e+cOw48CCwACoDXnXMbYx9p1RYvhrQ0aNEi6EhERERCrF0Ln34Kd94ZdCQiIvVKUKvtzQfmn2afX530/n3g/RiGVS3//jesXg0TJwYdiYiIyEneeAMaN4aRI4OORESkXqlTq+3Fk+xsOHFCi0WIiEgd9P77kJ4O558fdCQiIvWKkqcztHQpnH02XHNN0JGIiIiE2LoV1q+HoUODjkREpN5R8nSGsrOhVy9o2jToSEREREK8789w1/LkIiJRp+TpDOzfD5984i1iJCIiUqfMnw8XXwzJyUFHIiJS7yh5OgMrVnjXO2mJchERqVNKSyErC374Q93bSUQkBpQ8nYHsbO/+TrreSURE6pS33vJ+3Rs1KuhIRETqJSVPZyA7G3r00P2dRESkjlm4ENq3hyuvDDoSEZF6KZD7PMWzI0dg1Sp44IGgIxGpu44dO0ZxcTGHDx8OOhSpZU2bNqVdu3Y0adIk6FAapnXroGdPTdkTEYkRJU/VtHq1l0BpsQiRyhUXF9OiRQs6deqE6X/iGgznHKWlpRQXF5OUlBR0OA3PwYOweTPcdlvQkYiI1FuatldN2dnec3p6sHGI1GWHDx+mVatWSpwaGDOjVatWcTXiaGajzGyjmZWZWWpIeZqZ5fmPdWY24qTjEsxsrZm9G1KWZGarzGyzmc0xs7Nqsy1s2ABlZdC9e61+rIhIQ6LkqZo++gg6d4ZWrYKORKRuU+LUMMXhed8A3AxkhylPdc6lAIOAF8wsdLbGQ0DBScc8DfzOOXcp8DXwf2ITciXWrfOelTyJiMSMkqdqOH4ccnI0ZU9EpL5wzhU45zaFKT/onDvuv20KuPJtZtYOGAr8OaTMgH7AXL/oZeCmWMUd1rp13kpGnTrV6seKiDQkSp6qYd062LdP93cSiQfNmzePSj1jxowhKSmJlJQUevTowYoVKyq2Pfzww2T7c3mnTp3KwYMHo/KZoR599FEWL14c9Xrl9Mysl5ltBPKBe0OSqanAL4CykN1bAXtD9ikGLqqi7nFmlmtmuSUlJdEJeP166NoVGqlrFxGJFX3DVsNHH3nPSp5EGpbMzEzy8vKYPHky99xzDwB79uxh5cqVZPhD0bFKnsaPH8/kyZOjXm9DYmZZZrYhzGN4Vcc551Y55zoDVwETzaypmQ0Ddjnn1pz8MeGqqKLuF51zqc651MTExGq3KUyFkJ8P3brVvC4REamUkqdqyM6Giy+Gdu2CjkREIuWcY8KECXTp0oWuXbsyZ84cAMrKyrj//vvp3Lkzw4YNY8iQIcydO7fKujIyMigsLARg7ty5DBo0CIBp06axbds2+vbtS9++fZk+fTo/+9nPKo7705/+xCOPPEJRURFXXHEFo0ePplu3bowcObIi4VqzZg19+vShZ8+eXH/99Wzfvh2Ajh07Ulpayo4dO6L+b9NQOOcGOOe6hHm8HeHxBcABoAvQG7jRzIqA2UA/M3sV2A20DLkuqh2wLeqNqcxXX8Hevd7Ik4iIxIyWKo+Qc97I09ChQUciEl8efhjy8qJbZ0oKTJ0a2b5vvvkmeXl5rFu3jt27d3PVVVeRkZFBTk4ORUVF5Ofns2vXLpKTkxk7dmyVdb3zzjt09f/nNCcnh5EjRwLw05/+lN/+9rcsWbKECy64gAMHDtCtWzemTJlCkyZNeOmll3jhhRcA2LRpE9OnT6d3796MHTuW5557joceeojx48fz9ttvk5iYyJw5c3jiiSeYMWMGAD169CAnJ4dbbrnlDP/FpLrMLAnY6pw7bmYdgcuBIufcRGCiv891wKPOuR/575cAI/GSqtFARMlZVOTne89KnkREYkrJU4Q+/RR279ZiESLxZtmyZdx+++0kJCTQunVr+vTpw+rVq1m2bBmjRo2iUaNGtGnThr59+1Zax4QJE5g0aRKJiYlMnz4dgO3bt1PZdKtzzjmHfv368e6775KcnMyxY8fo2rUrRUVFtG/fnt69ewPwox/9iGnTpjFo0CA2bNjAwIEDAThx4gRt27atqO/CCy9k27baG8RoSPwlyH8PJALvmVmec+56IB143MyO4V3bdL9zbvdpqnsMmG1mk4C1wPQYhv5t5clTly619pEiIg2RkqcIld/fSdc7iVRPpCNEseJc+MtOKisPJzMzs2KUqVyzZs2qvJ/R3Xffza9//WuuuOIKfvKTn1SUn7yUt5nhnKNz587fWowi1OHDh2nWrFnE8UrknHPzgflhyl8BXjnNsUuBpSHvvwDSohthhNav9+aUn3deIB8vItJQ6JqnCGVnQ5s28N3vBh2JiFRHRkYGc+bM4cSJE5SUlJCdnU1aWhrp6enMmzePsrIydu7cydKlS6tVb3JycsX1TwAtWrRg3759Fe979erF1q1b+etf/8rtt99eUb5ly5aKJOm1114jPT2dyy+/nJKSkoryY8eOsXHjxopjPvvsM7poREGqkp+vKXsiIrVAyVOEli3zRp3i7/6PIg3biBEj6NatG927d6dfv35MmTKFNm3acMstt9CuXTu6dOnCPffcQ69evTj33HMjrnfo0KHfSrjGjRvH4MGDvzX974c//CG9e/fmvJDRgOTkZF5++WW6devGnj17uO+++zjrrLOYO3cujz32GN27dyclJYXly5cDXiJVWFhIampqzf8xpH46dgwKCpQ8iYjUAk3bi0BxMWzZAo88EnQkIhKp/fv3A960uMzMTDIzM7+1vVGjRvzP//wPzZs3p7S0lLS0tIrFIELNnDkzbP3XXnstEydOZO/evbRs2ZLx48czfvz4b+2zbNmyb626V/65zz///Cn1paSkVNwzKtS7777LyJEjadxYX9dSic8+8xIoJU8iIjGn3jgC5ZchfP/7wcYhItE1bNgw9u7dy9GjR/nlL39JmzZtqnX8M888w5YtW2jZsuW3yvfu3UtaWhrdu3enf//+NYrx+PHj/PznP69RHVLPaaU9EZFao+QpAjk50KyZtzyyiNQf1b3O6WS9evUKW96yZUs+++yzU8o7derEhg0bqvUZo0aNOqPYpAHJz4eEBLjiiqAjERGp93TNUwSWL4e0NGjSJOhIRERETpKfD5dfDmefHXQkIiL1npKn0zh4ENau1ZQ9ERGpo/75T93fSUSklih5Oo3Vq+H4cSVPIiJSB5WVeSsaJSUFHYmISIOg5Ok0/NWCueaaYOMQERE5xY4d3kp7HTsGHYmISIMQSPJkZqPMbKOZlZlZakh5JzM7ZGZ5/uP5kG09zSzfzArNbJpZ7dxxKSfHuwa3Vava+DQREZFq+PJL77lDh2DjEBFpIIIaedoA3AycelMT+Nw5l+I/7g0p/yMwDrjUfwyKdZBlZd4y5ZqyJxJ/mjdvHpV6xowZQ1JSEikpKfTo0YMV5fcuAB5++OGKezNNnTqVgwcP1lpcoZYuXcqYMWNOKd+7dy/PPfdc1D8PYMCAAXz99dcxqVuqYcsW71kjTyIitSKQ5Mk5V+Cc2xTp/mbWFviOc26Fc84BfwFuilmAvs8+gz17oHfvWH+SiNRlmZmZ5OXlMXnyZO655x4A9uzZw8qVK8nIyAAiT55qUyyTp7vuuitmdUs1aORJRKRW1cX7PCWZ2Vrg38CTzrmPgIuA4pB9iv2ysMxsHN4oFR1q0KHk5HjPGnkSOXMP/+Nh8nbkRbXOlDYpTB00NaJ9nXP84he/4O9//ztmxpNPPsmtt95KWVkZDz74IB9++CFJSUmUlZUxduxYRo4cWWldGRkZFBYWAjB37lwGDfIGwKdNm8a2bdvo27cvF1xwAUuWLOG1117j17/+Nc45hg4dytNPP/2tunbv3s0NN9zAk08+ydChQ8nMzOT111/nyJEjjBgxgqeeeoqioiIGDx5Meno6y5cv56KLLuLtt9+mWbNmEbX98ccf5/PPPyclJYWBAweyY8cORo4cyfDhwwG48847ufXWW9mzZw/z58/nyJEj/Otf/+KOO+7gv/7rvwB49dVXmTZtGkePHqVXr14899xzJCQkcOONN3LttdfyxBNPRBSLxMiWLdCyJXznO0FHIiLSIMRs5MnMssxsQ5jH8CoO2w50cM5dCTwC/NXMvgOEu77JVVaJc+5F51yqcy41MTHxjNuwfDmcfz5cdtkZVyEiAXvzzTfJy8tj3bp1ZGVlMWHCBLZv386bb75JUVER+fn5/PnPf/7WdLzKvPPOO3Tt2hWAnJwcevbsCcBPf/pT/uM//oMlS5awZMkStm3bxmOPPcbixYvJy8tj9erVvPXWWxX17Ny5k6FDh/Lf//3fDB06lIULF7J582Y+/vhj8vLyWLNmTcV0wM2bN/PAAw+wceNGWrZsybx58yJu++TJk7nkkkvIy8sjMzOTu+++m5deegmAb775huXLlzNkyBAAPv74Y2bNmkVeXh5vvPEGubm5FBQUMGfOHHJycsjLyyMhIYFZs2YBcN5553HkyBFKS0sjjkdi4MsvNWVPRKQWxWzkyTk34AyOOQIc8V+vMbPPgcvwRprahezaDtgWjTirsny5N+rUSGsSipyxSEeIYmXZsmXcfvvtJCQk0Lp1a/r06cPq1atZtmwZo0aNolGjRrRp04a+fftWWseECROYNGkSiYmJTJ8+HYDt27dT2Y8zq1ev5rrrrqvYfuedd5Kdnc1NN93EsWPH6N+/P88++yx9+vQBYOHChSxcuJArr7wSgP3797N582Y6dOhQcb0VQM+ePSkqKjrjf4s+ffrwwAMPsGvXLt58801uueUWGjf2uoGBAwfSyl8Z5+abb2bZsmU0btyYNWvWcNVVVwFw6NAhLrzwwor6LrzwQrZt21ZxnATgyy+1TLmISC2qU9P2zCwR2OOcO2FmF+MtDPGFc26Pme0zs6uBVcCPgd/HMpbSUvj0U/jxj2P5KSISa95lkpGXh5OZmXnKdL5mzZpx+PDhatfduHFjevbsyYIFCyqSJ+ccEydOrLieqlxRURFnn312xfuEhAQOHToUcdzh3HXXXcyaNYvZs2czY8aMivKTFzA1M5xzjB49mt/85jdh6zp8+HDEUwglRrZsAf/vSEREYi+opcpHmFkxcA3wnpkt8DdlAOvNbB0wF7jXObfH33Yf8GegEPgc+HssYzzvPNi4EUaPjuWniEisZWRkMGfOHE6cOEFJSQnZ2dmkpaWRnp7OvHnzKCsrY+fOnSxdurRa9SYnJ1dc/wTQokUL9u3bB0CvXr348MMP2b17NydOnOC1116rSJTMjBkzZvDpp58yefJkAK6//npmzJjB/v37Afjqq6/YtWtXjdseGlO5MWPGMHWqNxrYuXPnivIPPviAPXv2cOjQId566y169+5N//79mTt3bkUse/bs4Ut/gQLnHDt27KBTp041jlPOkHPeFIlHHgk6EhGRBiOQkSfn3HxgfpjyeUDYCf3OuVygS4xDq9CoEXzve7X1aSISKyNGjGDFihV0794dM2PKlCm0adOGW265hUWLFtGlSxcuu+wyevXqxbnnnhtxvUOHDuWFF17g7rvvBmDcuHEMHjyYtm3bsmTJEn7zm9/Qt29fnHMMGTKkYpEG8EaQZs+ezQ033MB3vvMd7r//fgoKCrjGvxt38+bNefXVV0lISKhR21u1akXv3r3p0qULgwcPJjMzk9atW5OcnMxNN317wdL09HTuuusuCgsLueOOO0hN9W7BN2nSJH7wgx9QVlZGkyZNePbZZ+nYsSNr1qzh6quvrpj2JwEwU0clIlLLrDpTV+JRamqqy83NDToMkQaloKCA5OTkoMM4rf3799O8eXNKS0tJS0sjJyeHNm3aRHx8eno67777Li1btoxhlKe3dOlSZs6cycyZM0+778GDB+natSuffPJJRbI4c+ZMcnNz+cMf/hDxZz700EPceOON9O/f/5Rt4c6/ma1xzqWesrOonxIRqQMi7af0k6GINFjDhg1j7969HD16lF/+8pfVSpwAnnnmGbZs2RJ48hSprKwsxo4dyyOPPFKtUbZwunTpEjZxEhERqc808iQiURcvI0/1RVFREXl5eadMxQuKRp6qR/2UiEjwNPIkIoFyzp2ygpvERqdOnerMwg31/Qc5ERFp2HQHIxGJuqZNm1JaWqr/kW5gnHOUlpbStGnToEMRERGJCY08iUjUtWvXjuLiYkpKSoIORWpZ06ZNadeu3el3FBERiUNKnkQk6po0aUJSUlLQYYiIiIhElabtiYiIiIiIREDJk4iIiIiISASUPImIiIiIiESg3t/nycxKgC9rUMUFwO4ohVOXqF3xRe2KL2rXqTo65xKjGUx9oX6qUmpXfFG74ovadaqI+ql6nzzVlJnl1scbO6pd8UXtii9ql9Sm+npe1K74onbFF7XrzGnanoiIiIiISASUPImIiIiIiERAydPpvRh0ADGidsUXtSu+qF1Sm+rreVG74ovaFV/UrjOka55EREREREQioJEnERERERGRCCh5EhERERERiYCSp0qY2SAz22RmhWb2eNDx1ISZFZlZvpnlmVmuX3a+mX1gZpv95/OCjvN0zGyGme0ysw0hZWHbYZ5p/vlbb2Y9gou8apW061dm9pV/zvLMbEjItol+uzaZ2fXBRH16ZtbezJaYWYGZbTSzh/zyuD5nVbQrrs+ZmTU1s4/NbJ3frqf88iQzW+WfrzlmdpZffrb/vtDf3inI+Bsi9VN1j/qpim11/jsP1E/F2zmrM/2Uc06Pkx5AAvA5cDFwFrAO+F7QcdWgPUXABSeVTQEe918/DjwddJwRtCMD6AFsOF07/S7c9AAABkhJREFUgCHA3wEDrgZWBR1/Ndv1K+DRMPt+z/97PBtI8v9OE4JuQyXtagv08F+3AD7z44/rc1ZFu+L6nPn/7s39102AVf55eB24zS9/HrjPf30/8Lz/+jZgTtBtaEgP9VN186F+Kn6+8/xY1U/F0TmrK/2URp7CSwMKnXNfOOeOArOB4QHHFG3DgZf91y8DNwUYS0Scc9nAnpOKK2vHcOAvzrMSaGlmbWsn0uqppF2VGQ7Mds4dcc79CyjE+3utc5xz251zn/iv9wEFwEXE+Tmrol2ViYtz5v+77/ffNvEfDugHzPXLTz5f5edxLtDfzKyWwhX1U3WS+ikgTr7zQP1UiLg4Z3Wln1LyFN5FwNaQ98VU/UdX1zlgoZmtMbNxfllr59x28P4jAy4MLLqaqawd9eEcPuhPC5gRMl0lLtvlD5VfifcrUb05Zye1C+L8nJlZgpnlAbuAD/B+fdzrnDvu7xIae0W7/O3fAK1qN+IGLW7+riKkfio+z2Fcf+eFUj8VH+2qC/2UkqfwwmWl8byme2/nXA9gMPCAmWUEHVAtiPdz+EfgEiAF2A4845fHXbvMrDkwD3jYOffvqnYNU1Zn2xamXXF/zpxzJ5xzKUA7vF8dk8Pt5j/HTbvqqfr2769+yhNP5zDuv/PKqZ+Kn3bVhX5KyVN4xUD7kPftgG0BxVJjzrlt/vMuYD7eH9vO8qFm/3lXcBHWSGXtiOtz6Jzb6X9BlAF/4n+Hz+OqXWbWBO+Le5Zz7k2/OO7PWbh21ZdzBuCc2wssxZtL3tLMGvubQmOvaJe//Vwin9YjNRd3f1dVUT8FxNk5rC/feeqngDhqV7kg+yklT+GtBi71V+84C+8is78FHNMZMbNzzKxF+WvgB8AGvPaM9ncbDbwdTIQ1Vlk7/gb82F8Z52rgm/Ih+Hhw0hzqEXjnDLx23eavIJMEXAp8XNvxRcKfVzwdKHDO/TZkU1yfs8raFe/nzMwSzayl/7oZMABvnvwSYKS/28nnq/w8jgQWO+fq5C+V9ZT6qfgR1995lYn37zxQP0WcnbM6009FurJEQ3vgrajyGd5cyieCjqcG7bgYbwWVdcDG8rbgzflcBGz2n88POtYI2vIa3jDzMbxfE/5PZe3AG6p91j9/+UBq0PFXs12v+HGv9//jbxuy/xN+uzYBg4OOv4p2peMNj68H8vzHkHg/Z1W0K67PGdANWOvHvwH4T7/8YrxOtBB4AzjbL2/qvy/0t18cdBsa2kP9VN17qJ+q2L/Of+f5caqfiqNzVlf6KfMrFxERERERkSpo2p6IiIiIiEgElDyJiIiIiIhEQMmTiIiIiIhIBJQ8iYiIiIiIREDJk4iIiIiISASUPIlEmZkt9587mdkdUa77/4b7LBERkUipnxI5c1qqXCRGzOw64FHn3LBqHJPgnDtRxfb9zrnm0YhPREQaNvVTItWnkSeRKDOz/f7LycC1ZpZnZj8zswQzyzSz1Wa23szu8fe/zsyWmNlf8W5eh5m9ZWZrzGyjmY3zyyYDzfz6ZoV+ln+380wz22Bm+WZ2a0jdS81srpl9amaz/DuPi4hIA6V+SuTMNQ46AJF67HFCftHzO5dvnHNXmdnZQI6ZLfT3TQO6OOf+5b8f65zbY2bNgNVmNs8597iZPeicSwnzWTcDKUB34AL/mGx/25VAZ2AbkAP0BpZFv7kiIhJn1E+JVJNGnkRqzw+AH5tZHrAKaAVc6m/7OKRDAvipma0DVgLtQ/arTDrwmnPuhHNuJ/AhcFVI3cXOuTIgD+gUldaIiEh9o35K5DQ08iRSewwY75xb8K1Cb875gZPeDwCucc4dNLOlQNMI6q7MkZDXJ9B/9yIiEp76KZHT0MiTSOzsA1qEvF8A3GdmTQDM7DIzOyfMcecCX/sd0hXA1SHbjpUff5Js4FZ/vnoikAF8HJVWiIhIfaV+SqSalNmLxM564Lg/rWEm8P/wpiJ84l8MWwLcFOa4fwD3mtl6YBPelIhyLwLrzewT59ydIeXzgWuAdYADfuGc2+F3aiIiIuGonxKpJi1VLiIiIiIiEgFN2xMREREREYmAkicREREREZEIKHkSERERERGJgJInERERERGRCCh5EhERERERiYCSJxERERERkQgoeRIREREREYnA/wcvnfOlc5fT9wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1008x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(14,5))\n",
    "# type and token scores\n",
    "axes[0].plot(score_type_list, c='b', label='log P(type)')\n",
    "axes[0].plot(score_token_list, c='g', label='log P(token | type)')\n",
    "axes[0].set_ylabel('log-likelihood')\n",
    "axes[0].set_xlabel('iteration')\n",
    "axes[0].legend()\n",
    "# image score\n",
    "axes[1].plot(score_img_list, c='r', label='log P(image | token)')\n",
    "axes[1].set_ylabel('log-likelihood')\n",
    "axes[1].set_xlabel('iteration')\n",
    "axes[1].legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### check pimg vs iteration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 144x144 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x144 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(2,2))\n",
    "plt.imshow(img_target, cmap='Greys')\n",
    "box_only(plt)\n",
    "plt.title('target')\n",
    "plt.show()\n",
    "print('')\n",
    "\n",
    "fig, axes = plt.subplots(nrows=1, ncols=10, figsize=(15, 2))\n",
    "for i in range(10):\n",
    "    axes[i].imshow(imgs[i], cmap='Greys')\n",
    "    box_only(axes[i])\n",
    "    axes[i].set_title('%i' % (interval*i))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
